package Hash.Easy;

import java.util.HashMap;

public class LC0001 {
    /**
     * O(N)算法。遍历每个数字是必不可少的，为此，想要在O(N)时间内解出此题，就需要对每个数字的操作都在O(1)时间。对每个数字的操作，
     * 实际上就是看nums中是否存在一个数，使得两数相加为target；换言之，是个查找问题。而O(1)级别的查找算法中，最常用的就是哈希。
     */
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> numberIdxMap = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            numberIdxMap.put(nums[i], i);
        }

        for (int i = 0; i < nums.length; i++) {
            int remainder = target - nums[i];
            if (numberIdxMap.containsKey(remainder)) {
                int otherIdx = numberIdxMap.get(target - nums[i]);
                if (otherIdx == i) continue;
                return new int[]{Math.min(i, otherIdx), Math.max(i, otherIdx)};
            }
        }

        return null;
    }
}
